package com.future.common.config;

import com.alibaba.druid.filter.logging.Log4jFilter;
import com.future.common.handler.RequestIdHandler;
import com.future.common.interceptor.ActionPerformanceLoggingInterceptor;
import com.future.common.interceptor.AppExceptionInterceptor;
import com.future.common.interceptor.AsyncInterceptor;
import com.future.common.interceptor.AuthenInterceptor;
import com.future.common.interceptor.JsonInterceptor;
import com.future.common.interceptor.LogExecutionTimeInterceptor;
import com.future.common.interceptor.MobileInterceptor;
import com.future.common.interceptor.RequestParasValidator;
import com.future.common.jfinalcustom.FutureAopFactory;
import com.future.common.plugins.SocketIoPlugin;
import com.future.common.plugins.WxPlugin;
import com.future.model._MappingKit;
import com.jfinal.aop.AopManager;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.json.MixedJsonFactory;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.cron4j.Cron4jPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.druid.DruidStatViewHandler;
import com.jfinal.render.ViewType;
import com.jfinal.template.Engine;

public class MainConfig extends JFinalConfig {
	/**
	 * 配置JFinal常量
	 */
	@Override
	public void configConstant(Constants me) {
		this.readConfig();
		// 设置当前是否为开发模式on
		me.setDevMode(PropKit.getBoolean("devMode"));
		// 设置默认上传文件保存路径 getFile等使用
		me.setBaseUploadPath("C:\\tdupload\\");
		// 设置上传最大限制尺寸
		// me.setMaxPostSize(1024*1024*10);
		// 设置默认下载文件路径 renderFile使用
		me.setBaseDownloadPath("download");
		// 设置默认视图类型
		me.setViewType(ViewType.JFINAL_TEMPLATE);
		// 设置404渲染视图
		// me.setError404View("404.html");
		// 设置json工厂
		me.setJsonFactory(MixedJsonFactory.me());
		//依赖注入
		me.setInjectDependency(true);
		//使用cglib 生成代理类
		me.setToCglibProxyFactory();
		
		//设置自定义的aopFactory
		AopManager.me().setAopFactory(new FutureAopFactory());
	}
	/**
	 * 读取配置文件
	 */
	private void readConfig(){
		Prop config = PropKit.use("config.properties");
		String activeConfig = PropKit.get("profiles.active");
		if(!StrKit.isBlank(activeConfig)){
			config.appendIfExists("config_"+activeConfig+".properties");
		}
	}

	/**
	 * 配置JFinal路由映射
	 */
	@Override
	public void configRoute(Routes me) {
		me.setMappingSuperClass(true); //开启父类方法也映射成为action
		me.add(new ControllerScan());
	}

	/**
	 * 配置JFinal插件 数据库连接池 ORM 缓存等插件 自定义插件
	 */
	@Override
	public void configPlugin(Plugins me) {
		// 配置数据库连接池插件
		DruidPlugin dbPlugin = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password"));
		dbPlugin.setFilters("stat,wall");
		dbPlugin.setDriverClass("com.mysql.jdbc.Driver");
		// 开发模式下打印sql
		if (JFinal.me().getConstants().getDevMode()) {
			Log4jFilter logFilter = new Log4jFilter();
			logFilter.setStatementLogEnabled(false);
			logFilter.setStatementLogErrorEnabled(true);
			logFilter.setStatementExecutableSqlLogEnable(true);
			dbPlugin.addFilter(logFilter);
		}
		
		// orm映射 配置ActiveRecord插件
		ActiveRecordPlugin arp = new ActiveRecordPlugin(dbPlugin);
		arp.setShowSql(false);
		arp.setDialect(new MysqlDialect());
		arp.getEngine().setToClassPathSourceFactory();
		arp.addSqlTemplate("sql/all_sqls.sql");
		/******** 在此添加数据库 表-Model 映射 *********/
		// 如果使用了JFinal Model 生成器 生成了BaseModel 把下面注释解开即可
		_MappingKit.mapping(arp);
		
		//微信支持
		WxPlugin wxPlugin = new WxPlugin();
		//socketioplugin
		SocketIoPlugin socketIoPlugin = new SocketIoPlugin();
		//任务调度
		Cron4jPlugin cron4jPlugin = new Cron4jPlugin(PropKit.getProp());
		
		
		// 添加到插件列表中
		me.add(dbPlugin);
		me.add(arp);
		me.add(wxPlugin);
		me.add(socketIoPlugin);
		me.add(cron4jPlugin);
	}

	/**
	 * 配置全局拦截器
	 */
	@Override
	public void configInterceptor(Interceptors me) {
		//耗时拦截器
		me.addGlobalActionInterceptor(new ActionPerformanceLoggingInterceptor());
		// 异常处理拦截器
		me.addGlobalActionInterceptor(new AppExceptionInterceptor());
		// 认证信息拦截器
		me.addGlobalActionInterceptor(new AuthenInterceptor());
		//请求是否来自mobile，便于业务处理
		me.addGlobalActionInterceptor(new MobileInterceptor());
		//参数校验
		me.addGlobalActionInterceptor(new RequestParasValidator());
		//json 拦截,使得json参数也能作为action的参数，放在方法参数上
		me.addGlobalActionInterceptor(new JsonInterceptor());
		//异步方法
		me.addGlobalServiceInterceptor(new AsyncInterceptor());
		//对service或者dao等非controller层增加时间记录
		me.addGlobalServiceInterceptor(new LogExecutionTimeInterceptor());
	}

	/**
	 * 配置全局处理器
	 */
	@Override
	public void configHandler(Handlers me) {
		me.add(new RequestIdHandler());
		me.add(new DruidStatViewHandler("/druid",new DruidStatViewAuth()));
	}

	/**
	 * JFinal启动后调用
	 */
	@Override
	public void afterJFinalStart() {
		
	}

	/**
	 * JFinal Stop之前调用
	 */
	@Override
	public void beforeJFinalStop() {

	}

	/**
	 * 配置模板引擎
	 */
	@Override
	public void configEngine(Engine me) {
		// 这里只有选择JFinal TPL的时候才用
		// 配置共享函数模板
		// me.addSharedFunction("/view/common/layout.html")
	}
	
	
	public static void main(String[] args) {
		JFinal.start("src/main/webapp", 8080, "/api", 1);
	}

}